package com.english.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.english.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 用户数据访问层
 * 
 * @author sqh
 * @since 2025-01-15
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据微信ID查询用户
     * @param wechatId 微信ID
     * @return 用户信息
     */
    @Select("SELECT * FROM user WHERE wechat_id = #{wechatId}")
    User selectByWechatId(@Param("wechatId") String wechatId);

    /**
     * 更新用户信息
     * @param user 用户信息
     * @return 更新结果
     */
    @Update("UPDATE user SET name = #{name}, phone = #{phone}, role = #{role}, update_time = #{updateTime} WHERE id = #{id}")
    int updateUserById(User user);

    /**
     * 统计学生总数（role=0）
     */
    @Select("SELECT COUNT(*) FROM user WHERE role = 0")
    Integer countStudents();

    /**
     * 查询学生列表（支持搜索）
     */
    @Select("<script>" +
            "SELECT * FROM user WHERE role = 0 " +
            "<if test='keyword != null and keyword != \"\"'>" +
            "AND (name LIKE CONCAT('%', #{keyword}, '%') OR phone LIKE CONCAT('%', #{keyword}, '%'))" +
            "</if>" +
            "</script>")
    List<User> selectStudents(@Param("keyword") String keyword);

    /**
     * 根据ID查询用户
     * @param id 用户ID
     * @return 用户信息
     */
    User selectById(@Param("id") Long id);

    /**
     * 根据角色查询用户列表
     * @param role 用户角色
     * @return 用户列表
     */
    List<User> selectByRole(@Param("role") Integer role);

    /**
     * 批量查询用户
     * @param ids 用户ID列表
     * @return 用户列表
     */
    List<User> selectByIds(@Param("ids") List<Long> ids);

    /**
     * 根据姓名模糊查询用户
     * @param name 姓名
     * @return 用户列表
     */
    List<User> selectByNameLike(@Param("name") String name);

    /**
     * 根据手机号查询用户
     * @param phone 手机号
     * @return 用户信息
     */
    User selectByPhone(@Param("phone") String phone);

    /**
     * 统计管理员总数（role=1）
     */
    Integer countAdmins();

    /**
     * 查询所有用户（分页）
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 用户列表
     */
    List<User> selectAllWithPagination(@Param("offset") Integer offset, @Param("limit") Integer limit);
} 